package conservare.web;

import java.io.Serializable;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;

import org.primefaces.context.RequestContext;

import conservare.modelo.Endereco;
import conservare.modelo.TelefoneCel;
import conservare.modelo.TelefoneRes;
import conservare.modelo.TipoLogradouro;
import conservare.modelo.UnidadeFederativa;
import conservare.modelo.financeiro.AtestadoMedico;
import conservare.modelo.funcionario.ExameMedico;
import conservare.modelo.funcionario.Funcionario;
import conservare.modelo.funcionario.TipoExameMedico;
import conservare.negocio.FuncionarioRN;
import conservare.negocio.TipoExameMedicoRN;
import conservare.negocio.TipoLogradouroRN;
import conservare.negocio.UnidadeFederativaRN;

@ManagedBean
@ViewScoped
public class FuncionarioBean implements Serializable{
	

	private static final long serialVersionUID = -1674095953535123644L;
	
	private static final int ESTADO_LISTAGEM_INDEX = 0;
	private static final int ESTADO_NOVO_INDEX = 1;
	private static final int ESTADO_EDICAO_INDEX = 2;
	
	private int index;
	private Funcionario funcionarioSelecionado;
	private ExameMedico exameMedicoSelecionado;
	private AtestadoMedico atestadoMedicoSelecionado;
	
	private List<Funcionario> funcionarios;
	private List<TipoLogradouro> tiposLogradouros;
	private List<UnidadeFederativa> ufs;
	private List<TipoExameMedico> tiposExamesMedicos;
	private List<AtestadoMedico> atestadosMedicos;
	
	public FuncionarioBean(){
		this.index = ESTADO_LISTAGEM_INDEX;
		this.exameMedicoSelecionado = new ExameMedico();
		this.atestadoMedicoSelecionado = new AtestadoMedico();
	}
	
	// methods for determining the current estado
	public boolean isEstadoListagemFuncionarios() { return index == ESTADO_LISTAGEM_INDEX;}
	public boolean isEstadoNovoFuncionario() { return index == ESTADO_NOVO_INDEX;}
	public boolean isEstadoEdicaoFuncionario() { return index == ESTADO_EDICAO_INDEX;}
	
	public void doEstadoListagemFuncionarios() { index = ESTADO_LISTAGEM_INDEX; }
	public void doEstadoNovoFuncionario() { index = ESTADO_NOVO_INDEX; }
	public void doEstadoEdicaoFuncionario() { index = ESTADO_EDICAO_INDEX; }
	
	public String doPrepararNovoFuncionario(){
		Funcionario novoFunc = new Funcionario();
		novoFunc.setEndereco(new Endereco());
		novoFunc.setFoneRes(new TelefoneRes());
		novoFunc.setFoneCel(new TelefoneCel());
		setFuncionarioSelecionado(novoFunc);
		doEstadoNovoFuncionario();
		return null;
	}
	
	public void doSalvarFuncionario(ActionEvent actionEvent){
		
		doSalvarFuncionario();
		setFuncionarios(null);//força atualizar a lista do banco de dados
		
		FacesContext context = FacesContext.getCurrentInstance();
		FacesMessage message = new FacesMessage("Funcionario salvo com sucesso !");
		context.addMessage(null, message);
		
	}
	
	private void doSalvarFuncionario(){
		FuncionarioRN funcionarioRN = new FuncionarioRN();
		funcionarioRN.salvar(getFuncionarioSelecionado());
	}
	
	public void doPrepararNovoExameMedico(ActionEvent event){
		setExameMedicoSelecionado(new ExameMedico());
	}
	
	public void doSalvarExameMedico(ActionEvent actionEvent){
		getFuncionarioSelecionado().addExameMedico(getExameMedicoSelecionado());
		doSalvarFuncionario();
		
		//setExameMedicoSelecionado(null);
		
		FacesContext context = FacesContext.getCurrentInstance();
		FacesMessage message = new FacesMessage("Exame Medico salvo com sucesso !");
		context.addMessage(null, message);
	}
	
	public void doExcluirExameMedico(ActionEvent actionEvent){
		getFuncionarioSelecionado().removeExameMedico(getExameMedicoSelecionado());
		doSalvarFuncionario();
		
		FacesContext context = FacesContext.getCurrentInstance();
		FacesMessage message = new FacesMessage("Exame Medico Excluído com sucesso !");
		context.addMessage(null, message);
	}
	
	public void doPrepararNovoAtestadoMedico(ActionEvent event){
		setAtestadoMedicoSelecionado(new AtestadoMedico());
	}
	
	public void doSalvarAtestadoMedico(ActionEvent actionEvent){
		
        FacesMessage msg = null;  
        boolean isOk = true;  
        
		if(getAtestadoMedicoSelecionado().getDataInicioAtestado() != null && 
				getAtestadoMedicoSelecionado().getDataFimAtestado() != null &&
				getAtestadoMedicoSelecionado().getDataInicioAtestado().after(getAtestadoMedicoSelecionado().getDataFimAtestado())){
			msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Data Inicial deve ser MENOR ou IGUAL a Data Final", null);
			isOk = false;
		}else if(getAtestadoMedicoSelecionado().getId() != null && 
					getFuncionarioSelecionado().getAtestadoMedicoPeloId(getAtestadoMedicoSelecionado().getId()) != null){
				
			AtestadoMedico atestadoMedico = 
					getFuncionarioSelecionado().getAtestadoMedicoPeloId(getAtestadoMedicoSelecionado().getId());
				
			if(atestadoMedico != null){
					atestadoMedico.setAtivo(getAtestadoMedicoSelecionado().getAtivo());
					atestadoMedico.setDataFimAtestado(getAtestadoMedicoSelecionado().getDataFimAtestado());
					atestadoMedico.setDataInicioAtestado(getAtestadoMedicoSelecionado().getDataInicioAtestado());
					atestadoMedico.setNumeroCID(getAtestadoMedicoSelecionado().getNumeroCID());
					atestadoMedico.setObservacao(getAtestadoMedicoSelecionado().getObservacao());
					
					getFuncionarioSelecionado().addAtestadoMedico(atestadoMedico);
					doSalvarFuncionario();
					msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Atestado Médico foi salvo com sucesso !", null);
					isOk = true;  
			}
				
		}
			
		FacesContext.getCurrentInstance().addMessage(null, msg); 
		RequestContext context = RequestContext.getCurrentInstance(); 
		context.addCallbackParam("isOk", isOk);  
		
	}
	
	public void doExcluirAtestadoMedico(ActionEvent actionEvent){
		
		AtestadoMedico atestadoRemover = 
			getFuncionarioSelecionado().getAtestadoMedicoPeloId(getAtestadoMedicoSelecionado().getId());
		getFuncionarioSelecionado().removeAtestadoMedico(atestadoRemover);
		doSalvarFuncionario();
		//******** variave atestadoMedicoIdSelecionado;
		
		FacesContext context = FacesContext.getCurrentInstance();
		FacesMessage message = new FacesMessage("Atestado Medico Excluído com sucesso !");
		context.addMessage(null, message);
	}
	
	public Funcionario getFuncionarioSelecionado() {
		return funcionarioSelecionado;
	}
	
	public void setFuncionarioSelecionado(Funcionario funcionarioSelecionado) {
		this.funcionarioSelecionado = funcionarioSelecionado;
	}
	
	public List<Funcionario> getFuncionarios() {
		if(funcionarios == null){
			funcionarios = new FuncionarioRN().getTodos();
		}
		return funcionarios;
	}
	public void setFuncionarios(List<Funcionario> funcionarios) {
		this.funcionarios = funcionarios;
	}

	public List<TipoLogradouro> getTiposLogradouros() {
		if(tiposLogradouros == null){
			setTiposLogradouros(new TipoLogradouroRN().getTodos());
		}
		return tiposLogradouros;
	}

	public void setTiposLogradouros(List<TipoLogradouro> tiposLogradouros) {
		this.tiposLogradouros = tiposLogradouros;
	}

	public List<UnidadeFederativa> getUfs() {
		if(ufs == null){
			setUfs(new UnidadeFederativaRN().getTodos());
		}
		return ufs;
	}

	public void setUfs(List<UnidadeFederativa> ufs) {
		this.ufs = ufs;
	}

	public ExameMedico getExameMedicoSelecionado() {
		return exameMedicoSelecionado;
	}

	public void setExameMedicoSelecionado(ExameMedico exameMedicoSelecionado) {
		this.exameMedicoSelecionado = exameMedicoSelecionado;
	}

	public List<TipoExameMedico> getTiposExamesMedicos() {
		if(tiposExamesMedicos == null){
			setTiposExamesMedicos(new TipoExameMedicoRN().getTodos());
		}
		return tiposExamesMedicos;
	}

	public void setTiposExamesMedicos(List<TipoExameMedico> tiposExamesMedicos) {
		this.tiposExamesMedicos = tiposExamesMedicos;
	}

	public List<AtestadoMedico> getAtestadosMedicos() {
		return atestadosMedicos;
	}

	public void setAtestadosMedicos(List<AtestadoMedico> atestadosMedicos) {
		this.atestadosMedicos = atestadosMedicos;
	}

	public AtestadoMedico getAtestadoMedicoSelecionado() {
		return atestadoMedicoSelecionado;
	}

	public void setAtestadoMedicoSelecionado(AtestadoMedico atestadoMedicoSelecionado) {
		
		this.atestadoMedicoSelecionado.setId(atestadoMedicoSelecionado.getId());
		this.atestadoMedicoSelecionado.setAtivo(atestadoMedicoSelecionado.getAtivo());
		this.atestadoMedicoSelecionado.setDataFimAtestado(atestadoMedicoSelecionado.getDataFimAtestado());
		this.atestadoMedicoSelecionado.setDataInicioAtestado(atestadoMedicoSelecionado.getDataInicioAtestado());
		this.atestadoMedicoSelecionado.setNumeroCID(atestadoMedicoSelecionado.getNumeroCID());
		this.atestadoMedicoSelecionado.setObservacao(atestadoMedicoSelecionado.getObservacao());
		
	}

	
	
}
